import PlatformsList from '../../components/PlatformsList/PlatformsList.tsx';

# Methods

This page shows the list of available methods.

## Details

### `dismissFullscreenPlayer`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
dismissFullscreenPlayer(): Promise<void>
```

Exits fullscreen mode.

> **Deprecated:** Use `setFullScreen(false)` instead.

---

### `pause`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
pause(): Promise<void>
```

Pauses the video.

---

### `presentFullscreenPlayer`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
presentFullscreenPlayer(): Promise<void>
```

Enters fullscreen mode.

- On **iOS**, this opens a fullscreen view controller with controls.
- On **Android**, this makes the player fullscreen but requires styling to match screen dimensions.

> **Deprecated:** Use `setFullScreen(true)` instead.

---

### `resume`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
resume(): Promise<void>
```

Resumes video playback.

---

### `restoreUserInterfaceForPictureInPictureStopCompleted`

<PlatformsList types={['iOS']} />

```tsx
restoreUserInterfaceForPictureInPictureStopCompleted(restored)
```

Must be called after `onRestoreUserInterfaceForPictureInPictureStop`.
Corresponds to Apple's [`restoreUserInterfaceForPictureInPictureStop`](https://developer.apple.com/documentation/avkit/avpictureinpicturecontrollerdelegate/1614703-pictureinpicturecontroller?language=objc).

---

### `save`

<PlatformsList types={['iOS']} />

```tsx
save(): Promise<{ uri: string }>
```

Saves the video to the user's **Photos app** with the current filter.

#### Notes:
- Supports **MP4** export only.
- Exports to the **cache directory** with a generated UUID filename.
- Requires **internet connection** if the video is not already buffered.
- Video remains in the **Photos app** until manually deleted.
- Works with **cached videos**.

#### Future improvements:
- Support for **multiple quality options**.
- Support for **more formats**.
- Support for **custom directory and filename**.

---

### `enterPictureInPicture`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
enterPictureInPicture()
```

Activates Picture-in-Picture (PiP) mode.

#### Android setup:
For **Expo**, enable PiP in `app.json`:

```json
"plugins": [
  [
    "react-native-video",
    {
      "enableAndroidPictureInPicture": true
    }
  ]
]
```

For **Bare React Native**, update `AndroidManifest.xml`:

```xml
<activity
  android:name=".MainActivity"
  android:supportsPictureInPicture="true">
</activity>
```

> **Note:**
> - On **Android**, entering PiP moves the app to the **background**.
> - On **iOS**, **video ads cannot start** in PiP mode ([Google IMA SDK](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/picture_in_picture?hl=en#starting_ads)).

---

### `exitPictureInPicture`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
exitPictureInPicture()
```

Exits Picture-in-Picture (PiP) mode.

---

### `seek`

<PlatformsList types={['All']} />

```tsx
seek(seconds: number)
```

Seeks to the specified position (**in seconds**).

#### Notes:
- **Must be called after** `onLoad`.
- Triggers the [`onSeek`](./events#onseek) event.

#### **iOS Exact Seek:**
```tsx
seek(seconds, tolerance: number)
```
- Default **tolerance**: ±100ms.
- Set `tolerance = 0` for **precise seeking**.

---

### `setVolume`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
setVolume(value: number): Promise<void>
```

Changes the **volume** level. Same behavior as the [`volume`](./props#volume) prop.

---

### `getCurrentPosition`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
getCurrentPosition(): Promise<number>
```

Returns the **current playback position** in seconds.

> **Throws an error** if the player is not initialized.

---

### `setSource`

<PlatformsList types={['Android', 'iOS']} />

```tsx
setSource(source: ReactVideoSource): Promise<void>
```

Updates the media source **dynamically**.

> **Note:** This **overrides** the `source` prop.

---

### `setFullScreen`

<PlatformsList types={['Android', 'iOS', 'web']} />

```tsx
setFullScreen(fullscreen: boolean): Promise<void>
```

Toggles fullscreen mode.

- `true` → Enters fullscreen.
- `false` → Exits fullscreen.

---

### `nativeHtmlVideoRef`

<PlatformsList types={['web']} />

A **reference to the native HTML `<video>` element**.
Useful for integrating **third-party** video libraries like **hls.js, shaka, video.js, etc.**.

---

### **Example Usage**

```tsx
const videoRef = useRef<VideoRef>(null);

const handleVideoControls = async () => {
  if (!videoRef.current) return;

  // Fullscreen controls
  videoRef.current.presentFullscreenPlayer();
  videoRef.current.dismissFullscreenPlayer();

  // Playback controls
  videoRef.current.pause();
  videoRef.current.resume();

  // Save video
  const response = await videoRef.current.save();
  console.log('Saved video path:', response.uri);

  // Seek to 200s (or with tolerance on iOS)
  videoRef.current.seek(200);
  videoRef.current.seek(200, 10);
};

return (
  <Video
    ref={videoRef}
    source={{ uri: 'https://www.w3schools.com/html/mov_bbb.mp4' }}
  />
);
```

## Static Methods

### `getWidevineLevel`

<PlatformsList types={['Android']} />

```tsx
getWidevineLevel(): Promise<number>
```

Returns the **Widevine DRM level**:

- **0** → Unknown / Not supported.
- **1, 2, 3** → Supported Widevine levels.

---

### `isCodecSupported`

<PlatformsList types={['Android', 'web']} />

```tsx
isCodecSupported(mimetype: string, width: number, height: number): Promise<'hardware' | 'software' | 'unsupported'>
```

Checks if the given **video codec** is supported.

| Result      | Meaning                                |
|------------|--------------------------------------|
| `hardware`  | Hardware decoding supported         |
| `software`  | Only software decoding available    |
| `unsupported` | Codec **not supported**            |

---

### `isHEVCSupported`

<PlatformsList types={['Android']} />

```tsx
isHEVCSupported(): Promise<boolean>
```

Checks if **HEVC (H.265)** is supported at **1920×1080 resolution**.

> Uses `isCodecSupported` internally.

---

### Static Methods Example Usage

```tsx
import { VideoDecoderProperties } from 'react-native-video';

VideoDecoderProperties.getWidevineLevel().then((level) => {
  console.log('Widevine Level:', level);
});

VideoDecoderProperties.isCodecSupported('video/hevc', 1920, 1080).then((support) => {
  console.log('HEVC Support:', support);
});

VideoDecoderProperties.isHEVCSupported().then((support) => {
  console.log('HEVC 1080p Support:', support);
});
```
